package flyweighgt_pattern.ex1;

import java.util.Arrays;
import java.util.List;

/**
 * AlchemistShop类代表一个炼金术商店，通过享元模式管理药水的创建和使用。
 *
 * 该类持有两个药水架：底层架(bottomShelf)和顶层架(topShelf)，
 * 它们都使用药水工厂(PotionFactory)来获取药水对象。利用享元模式，
 * 相同类型的药水只会被创建一次，复用已有的药水对象，从而节省内存和提高性能。
 *
 * @author 申书航
 * @version 1.0
 */
public class AlchemistShop {

    // 顶层药水架，存储药水对象
    private final List<Potion> topShelf;

    // 底层药水架，存储药水对象
    private final List<Potion> bottomShelf;

    /**
     * 构造函数，创建一个AlchemistShop对象，
     * 初始化顶层和底层的药水架。
     */
    public AlchemistShop() {
        PotionFactory factory = PotionFactory.getInstance(); // 获取药水工厂实例

        // 初始化底层药水架，获取不同类型的药水
        bottomShelf = Arrays.asList(
                factory.getPotion(PotionType.HEALING),
                factory.getPotion(PotionType.STRONG),
                factory.getPotion(PotionType.INVISIBILITY),
                factory.getPotion(PotionType.STRONG),
                factory.getPotion(PotionType.HOLLY_WATER),
                factory.getPotion(PotionType.HEALING),
                factory.getPotion(PotionType.INVISIBILITY)
        );

        // 初始化顶层药水架，获取不同类型的药水
        topShelf = Arrays.asList(
                factory.getPotion(PotionType.HEALING),
                factory.getPotion(PotionType.INVISIBILITY),
                factory.getPotion(PotionType.STRONG),
                factory.getPotion(PotionType.HEALING),
                factory.getPotion(PotionType.STRONG),
                factory.getPotion(PotionType.HOLLY_WATER),
                factory.getPotion(PotionType.INVISIBILITY)
        );
    }

    /**
     * 调用该方法喝掉底层和顶层的药水。
     * 通过遍历药水列表，并调用每个药水的drink方法实现。
     */
    public void drinkPotions() {
        System.out.println("喝掉底层的药水");
        bottomShelf.forEach(Potion::drink); // 喝掉底层药水

        System.out.println("喝掉顶层的药水");
        topShelf.forEach(Potion::drink); // 喝掉顶层药水
    }
}
